import logging
import os
from logging.handlers import RotatingFileHandler



class ProjectLogFilter(logging.Filter):
    """构造一个过滤器,只输出当前项目目录下的logger内容。"""
    def __init__(self):
        # 获取当前脚本的目录
        current_dir = os.path.abspath(os.path.dirname(__file__))

        # 获取上级目录
        parent_dir = os.path.join(current_dir, os.pardir)

        # 存储项目中所有的 Python 文件
        pys = []
        for _, _, i in os.walk(parent_dir):
            pys.extend([j for j in i if j.endswith('py')])
        self.pys = pys

    def filter(self, record):
        # 检查日志记录的文件名（record.filename）是否在 self.pys 列表中
        if record.filename in self.pys:
            return True
        return False


def init_root_logger(level, logfile=None, is_screen_output=True):
    """用来设置root logger的日志输出。
    参数：
        level:  日志等级
        logfile:  输出文件位置。
        screen: True/False,是否输出到屏幕。
    返回值：
        无
    """

    assert level in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL','NOTSET']
    assert is_screen_output in [True,False]

    handlers = []

    #屏幕输出 handler
    if is_screen_output:
        screen_handler = logging.StreamHandler()
        screen_handler.setLevel(level)
        screen_handler.addFilter(ProjectLogFilter())
        handlers.append(screen_handler)

    # 创建并配置向回滚文件中输出的handler
    if logfile is not None:
        filehanlder = RotatingFileHandler(
            logfile,
            maxBytes= 1000 * 1024 * 1024,
            backupCount=5,
            encoding='utf-8'
        )
        filehanlder.setLevel(level)

        handlers.append(filehanlder)


    # 设置输出格式
    LOG_FORMAT = '[\033[32m%(levelname)s/%(module)s:(%(lineno)d)  %(asctime)s ]\033[0m  %(message)s'
    LOG_FORMAT_DATE = '%Y-%m-%d %H:%M:%S'

    # root logger配置
    logging.basicConfig(level=level,
                        format=LOG_FORMAT,
                        datefmt=LOG_FORMAT_DATE,
                        handlers=handlers)



def init_module_logger(logger: logging.Logger ,level, logfile=None, is_screen_output=True):
    """用来设置各个模块 logger的日志输出。
    参数：
        logger: 需要设置的logger.
        level:  日志等级
        logfile:  输出文件位置。
        screen: True/False,是否输出到屏幕。
    返回值：
        无
    """

    assert level in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL','NOTSET']
    assert is_screen_output in [True, False]

    handlers = []

    # 屏幕输出 handler
    if is_screen_output:
        screen_handler = logging.StreamHandler()
        screen_handler.setLevel(level)
        screen_handler.addFilter(ProjectLogFilter())
        handlers.append(screen_handler)

    # 创建并配置向回滚文件中输出的handler
    if logfile is not None:
        filehanlder = RotatingFileHandler(
            logfile,
            maxBytes=10 * 1024 * 1024,
            backupCount=5
        )
        filehanlder.setLevel(level)
        handlers.append(filehanlder)

    # 设置输出格式
    LOG_FORMAT = '[\033[32m%(levelname)s/%(module)s:(%(lineno)d)  %(asctime)s ]\033[0m  %(message)s'
    LOG_FORMAT_DATE = '%Y-%m-%d %H:%M:%S'

    formatter = logging.Formatter(LOG_FORMAT,LOG_FORMAT_DATE)

    # 取消 log 记录向上传播
    logger.propagate = False
    # logger配置
    logger.setLevel(level)
    for handler in handlers:
        handler.setFormatter(formatter)
        logger.addHandler(handler)

